//The MIT License
//
//Copyright (c) <2011> <GEPAR - Grupo de Ensino e Pesquisa em Agroinformática e Rastreabilidade>
//
//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions:
//
//The above copyright notice and this permission notice shall be included in
//all copies or substantial portions of the Software.
//
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//THE SOFTWARE.

package com;

import com.br.util.FonteConexoes;
import java.text.SimpleDateFormat;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.sql.rowset.CachedRowSet;
import com.sun.rowset.CachedRowSetImpl;
import java.sql.*;

@ManagedBean(name="tabulacoes")
@ViewScoped
public class TabulacoesBean
{
    private int idProd;

    private int ano;

    private int mes;

    private int qtdeResultados;
    
    private int tabulacaoAtual;

    CachedRowSet resultados;
    
    // caso não houve resultados da pesquisa, a tabela de resultados
    // não deve ser exibida
    private boolean exibirResultados = true;

    // ACESSO AO BANCO DE DADOS. FUTURAMENTE, RETIRAR DESSA CLASSE.
//    @Resource(name="jdbc/hermesweb") private DataSource dataSource;

    public int getAno()
    {
        return ano;
    }

    public int getIdProd()
    {
        return idProd;
    }

    public int getMes()
    {
        return mes;
    }

    public int getQtdeResultados()
    {
        return qtdeResultados;
    }
    
    public int getTabulacaoAtual()
    {
        return tabulacaoAtual;
    }

    public CachedRowSet getResultados() throws Exception
    {
        return resultados;
    }
    
    public boolean getExibirResultados()
    {
        return exibirResultados;
    }

    public void setAno(int ano)
    {
        this.ano = ano;
    }

    public void setIdProd(int idProd)
    {
        this.idProd = idProd;
    }

    public void setMes(int mes)
    {
        this.mes = mes;
    }
    
    public void setTabulacaoAtual(int tabulacaoAtual)
    {
        this.tabulacaoAtual = tabulacaoAtual;
    }
    
    // ACESSO AO BANCO DE DADOS. FUTURAMENTE, RETIRAR DESSA CLASSE.

    public String getTabulacoes() throws Exception
    {
        // chamada aos métodos que recuperam, no banco, as tabulações
        // que satisfazem aos critérios de pesquisa estabelecidos
        efetuarPesquisa();

        return "Resultados da pesquisa";
    }

    public void efetuarPesquisa() throws Exception
    {
        Connection conexao = null;
        try {
            conexao = new FonteConexoes().getConnection();
        } catch (Exception e) {
            throw new SQLException(e.getMessage());
        }

        
        try
        {
            PreparedStatement sentenca =
                    conexao.prepareStatement(
                                             "SELECT " +
                                             "tabul.id_tabu, " + 
                                             "DATE_FORMAT(tabul.datac_tabu, '%d/%m/%Y') AS datac_tabu, " +
                                             "prod.nome_prod, " +
                                             "entrep.nome_entr " +
                                             "FROM " +
                                             "tabulacoes tabul " +
                                             "LEFT JOIN produtos prod ON tabul.id_prod = prod.id_prod " +
                                             "LEFT JOIN entrepostos entrep ON tabul.id_entr = entrep.id_entr " +
                                             "WHERE " +
                                             "tabul.id_prod = ? AND " +
                                             "tabul.datac_tabu >= ? AND " +
                                             "tabul.datac_tabu < ? AND " +
                                             "tabul.status_tabu = 'a'"
                                            );
            
            sentenca.setInt(1, idProd);

            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

            // conversões para se chegar à data inicial em formato java.sql.Date
            java.util.Date dataInicial = dateFormat.parse(ano + "-" + mes + "-01");
            Date dataSQLIni = new Date(dataInicial.getTime());
            sentenca.setDate(2, dataSQLIni);

            String proximoMes;

            // conversões para se chegar à data final em formato java.sql.Date
            if (mes == 12)
            {
                proximoMes = "1";
                String proximoAno = String.valueOf(ano + 1);
                java.util.Date data = dateFormat.parse(proximoAno + "-" + proximoMes + "-01");
                Date dataSQL = new Date(data.getTime());
                sentenca.setDate(3, dataSQL);
            }
            else
            {
                proximoMes = String.valueOf(mes + 1);
                java.util.Date data = dateFormat.parse(ano + "-" + proximoMes + "-01");
                Date dataSQL = new Date(data.getTime());
                sentenca.setDate(3, dataSQL);
            }

            // utilizamos um CachedRowSet para poder fechar a conexão com o banco de dados
            ResultSet rs = sentenca.executeQuery();
            resultados = new CachedRowSetImpl();
            resultados.populate(rs);
            qtdeResultados = resultados.size();

            if (qtdeResultados == 0)
            {
                // não há resultados a serem exibidos. Redirecionamos para a tela de pesquisa,
                // exibindo uma mensagem de aviso

//                FacesContext context = FacesContext.getCurrentInstance();
//                ConfigurableNavigationHandler handler =
//                    (ConfigurableNavigationHandler)context.getApplication().getNavigationHandler();
//                handler.performNavigation("pesqTabulacao?msg=2&faces-redirect=true");
                
                // caso não houve resultados da pesquisa, a tabela de resultados
                // não deve ser exibida
                exibirResultados = false;
            }
        }
        finally
        {
            conexao.close();
        }
    }
    
    public void excluirTabulacao() throws Exception
    {
        Connection conexao = null;
        
        try 
        {
            conexao = new FonteConexoes().getConnection();
            
        } catch (Exception e)
        {
            throw new SQLException(e.getMessage());
        }
        
        try
        {
            PreparedStatement sentenca =
                    conexao.prepareStatement("UPDATE tabulacoes SET status_tabu = 'e' WHERE id_tabu = ?");
            
            sentenca.setInt(1, tabulacaoAtual);
            
            // TODO
            // Um usuário acaba de excluir o registro que você está prestes a remover. É preciso tratar essa situação?
            // Tratar situações em que, por algum motivo, ocorra algum problema no banco de dados e a exclusão
            // não possa ser feita.
            sentenca.executeUpdate();
        }
        finally
        {
            conexao.close();
        }
    }
}
